// 配置路由处
import Vue from 'vue'
import VueRouter from 'vue-router'

import routes from './routes'

// 使用插件
Vue.use(VueRouter)

// 引入store
import store from '@/store'

const router = new VueRouter({
  routes,
  // 滚动行为
  scrollBehavior(to, from, savedPosition) {
    // 始终滚动到顶部
    return { y: 0 }
  }
});

// 全局守卫-前置守卫(在路由跳转之间进行判断)
router.beforeEach(async (to, from, next) => {
  // to：可以获取到你要跳转到哪个路由信息
  // from：可以获取到从哪个路由而来的信息
  // next：放行函数 next()放行 next(path)放行到指定路由 next(false)
  // console.log(to, from, next);
  // 用户登录才有token 未登录一定没有token
  // next();
  let token = store.state.user.token;
  // 用户信息
  let name = store.state.user.userInfo.name;
  // 用户已经登录
  if(token) {
    // 不可再回login
    if(to.path == '/login' || to.path == '/register') {
      next('/home');
    }else {
      // 已登录 但去的不是login
      // 如果用户名已有
      if(name) {
        next();
      }else {
        // 没有用户名 派发action让仓库存储用户信息再跳转
        try {
          // 获取用户信息成功
          await store.dispatch('getUserInfo');
          next();
        } catch (error) {
          // token失效了获取不到用户信息 清除token 重新登录
          await store.dispatch('userLogout');
          next('/login');
        }
      }
    }
  }else {
    // 用户未登录 不能去交易相关、支付相关和个人中心
    let toPath = to.path;
    if(toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
      // 把未登录时想去的没去成的信息 存储于地址栏中(路由)
      next('/login?redirect=' + toPath);
    }else {
      next();
    }
  }
})

export default router

// 重写 push | replace (解决路由的编程式导航跳转报错问题)
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

// function (告诉原 push | replace 方法 传递哪些参数, 成功回调, 失败回调) {}
/*
  call || apply 区别
  相同点：都可以调用函数一次，都可以篡改函数的上下文
  不同点：call 与 apply 传递参数: call用逗号隔开 apply传递数组
*/
VueRouter.prototype.push = function (location, resolve, reject) {
  // console.log(location);
  if (resolve && reject) {
    originPush.call(this, location, resolve, reject);
  } else {
    originPush.call(this, location, () => { }, () => { });
  }
}

VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    originReplace.call(this, location, resolve, reject);
  } else {
    originReplace.call(this, location, () => { }, () => { });
  }
}